package fiuba.dao.hibernate;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import fiuba.dao.hibernate.GenericDaoHibernate;
import fiuba.model.Bloqueo;
import fiuba.dao.BloqueoDao;
import fiuba.model.Noticia; 

import fiuba.model.User;

public class BloqueoDaoHibernate extends GenericDaoHibernate<Bloqueo, Long> 
	implements BloqueoDao {

	private final Integer diasExpiraBloqueo = 2;

    public BloqueoDaoHibernate() {
        super(Bloqueo.class);
    }
    
    // Devuelve "" si pudo bloquear el objeto, si no el nombre de usuario que lo tiene 
    public String Bloquear(String tipo, Long id, User usr) {
    	Date hoy = new Date();
    	Date fechaLimite;
    	Bloqueo bl;
    	List<Bloqueo> bloqueos = getHibernateTemplate().find("from Bloqueo where tipo = ? and idObjeto = ?", new Object[] {tipo, id});
    	if (bloqueos.size() == 0) {
    		// No hay bloqueos => genero el propio
    		bl = new Bloqueo();
    		bl.setFecha(new Date());
    		bl.setIdObjeto(id);
    		bl.setTipo(tipo);
    		bl.setUsuario(usr);
    		this.save(bl);
    		return "";
    	}
    	else {
    		bl = bloqueos.get(0);
    		// Si el bloqueo es del usuario actual => dejo pasar y actualizo la fecha
    		if (bl.getUsuario().getId().equals(usr.getId())) { 
    			bl.setFecha(new Date());
    			this.save(bl);
    			return "";
    		}
    		// Si el usuario es distinto (es decir, llegue aca) y la fecha es 
    		// anterior a limite, entonces esta OK que pase
        	Calendar cal = Calendar.getInstance(); 
        	cal.setTime(hoy);
        	cal.add(Calendar.DATE, - diasExpiraBloqueo);
        	fechaLimite = cal.getTime();
    		// Si la fecha del bloqueo es menor que la limite, pasa
    		if ( bl.getFecha().compareTo(fechaLimite) < 0) {
    			bl.setFecha(new Date());
    			bl.setUsuario(usr);
    			this.save(bl);
    			return "";
    		}
    		return bl.getUsuario().getFullName();
    	}
    }
    
    public void Liberar(String tipo, Long id, User usr) {
    	Bloqueo bl;
    	// Busco un bloqueo del tipo y id pedidos
    	List<Bloqueo> bloqueos = getHibernateTemplate().find("from Bloqueo where tipo = ? and idObjeto = ?", new Object[] {tipo, id});
    	if (bloqueos.size() > 0) { // Si hay bloqueo
    		bl = bloqueos.get(0);
    		// Si es del usuario correcto => lo borro nomas
    		if (bl.getUsuario().getId().equals(usr.getId())) {
        		this.remove(bl.getId());
    		}
    	}
    }
    public boolean estaBloqueado(String tipo, Long id, User usr){
    	Date hoy = new Date();
    	Date fechaLimite;
    	Bloqueo bl;
    	List<Bloqueo> bloqueos = getHibernateTemplate().find("from Bloqueo where tipo = ? and idObjeto = ?", new Object[] {tipo, id});
    	if (bloqueos.size() == 0) {
    		return false;
    	}
    	else {
    		bl = bloqueos.get(0);
    		// Si el bloqueo es del usuario actual => dejo pasar y actualizo la fecha
    		if (bl.getUsuario().getId().equals(usr.getId())) { 
    			return false;
    		}
    		// Si el usuario es distinto (es decir, llegue aca) y la fecha es 
    		// anterior a limite, entonces esta OK que pase
        	Calendar cal = Calendar.getInstance(); 
        	cal.setTime(hoy);
        	cal.add(Calendar.DATE, - diasExpiraBloqueo);
        	fechaLimite = cal.getTime();
    		// Si la fecha del bloqueo es menor que la limite, pasa
    		if ( bl.getFecha().compareTo(fechaLimite) < 0) {
    			return false;
    		}
    		return true;
    	}
    }
    
}
